home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-13
/
xvisrc.zip
/
PRESERVE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-28
|
4KB
|
177 lines
/* Copyright (c) 1990,1991,1992 Chris and John Downey */
#ifndef lint
static char *sccsid = "@(#)preserve.c 2.1 (Chris & John Downey) 7/29/92";
#endif
/***
* program name:
xvi
* function:
PD version of UNIX "vi" editor, with extensions.
* module name:
preserve.c
* module function:
Buffer preservation routines.
The do_preserve() routine saves the contents of all modified
buffers in temporary files. It can be invoked with the
:preserve command or it may be called by one of the system
interface modules when at least PSVKEYS keystrokes have been
read, & at least Pn(P_preservetime) seconds have elsapsed
since the last keystroke. (PSVKEYS is defined in xvi.h.) The
preservebuf() routine can be used to preserve a single buffer.
* history:
STEVIE - ST Editor for VI Enthusiasts, Version 3.10
Originally by Tim Thompson (twitch!tjt)
Extensive modifications by Tony Andrews (onecom!wldrdg!tony)
Heavily modified by Chris & John Downey
***/
#include "xvi.h"
/*
* Names of values for the P_preserve enumerated parameter.
*/
char *psv_strings[] =
{
"unsafe",
"standard",
"safe",
"paranoid",
NULL
};
/*
* Open temporary file for given buffer.
*/
static FILE *
psvfile(window)
Xviwin *window;
{
register Buffer *buffer;
FILE *fp;
buffer = window->w_buffer;
if (buffer->b_tempfname == NULL) {
char *fname;
fname = buffer->b_filename;
if (fname == NULL)
fname = "unnamed";
buffer->b_tempfname = tempfname(fname);
if (buffer->b_tempfname == NULL) {
show_error(window, "Can't create name for preserve file");
return(NULL);
}
}
fp = fopenwb(buffer->b_tempfname);
if (fp == NULL) {
show_error(window, "Can't open preserve file %s",
buffer->b_tempfname);
}
return(fp);
}
/*
* Write contents of buffer to file & close file. Return TRUE if no
* errors detected.
*/
static bool_t
putbuf(wp, fp)
Xviwin *wp;
register FILE *fp;
{
unsigned long l1, l2;
if (put_file(wp, fp, (Line *) NULL, (Line *) NULL, &l1, &l2) == FALSE) {
show_error(wp, "Error writing preserve file %s",
wp->w_buffer->b_tempfname);
return(FALSE);
} else {
return(TRUE);
}
}
/*
* Preserve contents of a single buffer, so that a backup copy is
* available in case something goes wrong while the file itself is
* being written.
*
* This is controlled by the P_preserve parameter: if it's set to
* psv_UNSAFE, we just return. If it's psv_STANDARD, to save time, we
* only preserve the buffer if it doesn't appear to have been
* preserved recently: otherwise, if it's psv_SAFE or psv_PARANOID, we
* always preserve it.
*
* Return FALSE if an error occurs during preservation, otherwise TRUE.
*/
bool_t
preservebuf(window)
Xviwin *window;
{
FILE *fp;
Buffer *bp;
if (
Pn(P_preserve) == psv_UNSAFE
||
(
Pn(P_preserve) == psv_STANDARD
&&
/*
* If there is a preserve file already ...
*/
(bp = window->w_buffer)->b_tempfname != NULL
&&
exists(bp->b_tempfname)
&&
/*
* & a preserve appears to have been done recently ...
*/
keystrokes < PSVKEYS
)
) {
/*
* ... don't bother.
*/
return(TRUE);
}
fp = psvfile(window);
if (fp == NULL) {
return(FALSE);
}
return(putbuf(window, fp));
}
/*
* Preserve contents of all modified buffers.
*/
bool_t
do_preserve()
{
Xviwin *wp;
bool_t psvstatus = TRUE;
wp = curwin;
do {
if (is_modified(wp->w_buffer)) {
FILE *fp;
fp = psvfile(wp);
if (fp != NULL) {
if (!putbuf(wp, fp))
psvstatus = FALSE;
} else {
psvstatus = FALSE;
}
}
} while ((wp = next_window(wp)) != curwin);
return(psvstatus);
}